//
// kernel.cpp
//
// Circle - A C++ bare metal environment for Raspberry Pi
// Copyright (C) 2016  R. Stange <rsta2@o2online.de>
// 
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
#include "kernel.h"

CKernel::CKernel (void)
:	m_Screen (m_Options.GetWidth (), m_Options.GetHeight ())
{
	m_ActLED.Blink (5);	// show we are alive
}

CKernel::~CKernel (void)
{
}

boolean CKernel::Initialize (void)
{
	return m_Screen.Initialize ();
}

TShutdownMode CKernel::Run (void)
{
	static const char CursorOff[] = "\x1b[?25l";
	m_Screen.Write (CursorOff, sizeof CursorOff);
	
	unsigned nPixels = m_Screen.GetWidth () * m_Screen.GetHeight ();
	
	while (1)
	{
		u32 nNumber = m_Random.GetNumber ();

		nNumber %= nPixels;

		m_Screen.SetPixel (nNumber % m_Screen.GetWidth (),
				   nNumber / m_Screen.GetWidth (), NORMAL_COLOR);
	}
	
	return ShutdownHalt;
}
